package vista;

import java.awt.ComponentOrientation;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
import jxl.Sheet;
import jxl.Workbook;
import modelo.Ejemplo;
import modelo.RedAdalaine;

/**
 *
 * @author Marlon
 */
public class FrmMenu extends javax.swing.JFrame {

    private int numEjemplos;
    private List<Ejemplo> listEjemplos;
    private List<String> listNombParam;
    private RedAdalaine redAdalaine;
    private int filaEmpieza;
    private int colEmpieza;
    private int colEmpieza2;
    private boolean errorFile;
    private String filePath;

    /** Creates new form FrmMenu */
    public FrmMenu() {
        initComponents();
        initStatusBar();
        statusMenu.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
        setIconImage(new ImageIcon(getClass().getResource("/imagenes/icon-casita.png")).getImage());
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        pnlEntrenamiento = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        statusMenu = new javax.swing.JPanel();
        lblStatus1 = new javax.swing.JLabel();
        lblStatus2 = new javax.swing.JLabel();
        lblStatus3 = new javax.swing.JLabel();
        lblStatus4 = new javax.swing.JLabel();
        jMenuBar1 = new javax.swing.JMenuBar();
        mnuArchivo = new javax.swing.JMenu();
        mnuItemImportarEjem = new javax.swing.JMenuItem();
        mnuItemQuitarEjem = new javax.swing.JMenuItem();
        mnuItemTasarCasas = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        mnuItemSalir = new javax.swing.JMenuItem();
        mnuEditar = new javax.swing.JMenu();
        mnuModEjemplos = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JPopupMenu.Separator();
        mnuEditParamLibres = new javax.swing.JMenuItem();
        mnuEditErroryN = new javax.swing.JMenuItem();
        jMenu3 = new javax.swing.JMenu();
        mnuItemIniciarEntrenamiento = new javax.swing.JMenuItem();
        jMenu5 = new javax.swing.JMenu();
        mnuItemAcercaDe = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Menú Principal - Tasación de Casas");
        setExtendedState(JFrame.MAXIMIZED_BOTH);

        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);

        javax.swing.GroupLayout pnlEntrenamientoLayout = new javax.swing.GroupLayout(pnlEntrenamiento);
        pnlEntrenamiento.setLayout(pnlEntrenamientoLayout);
        pnlEntrenamientoLayout.setHorizontalGroup(
            pnlEntrenamientoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlEntrenamientoLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 1962, Short.MAX_VALUE)
                .addGap(36, 36, 36))
        );
        pnlEntrenamientoLayout.setVerticalGroup(
            pnlEntrenamientoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlEntrenamientoLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 1310, Short.MAX_VALUE)
                .addGap(118, 118, 118))
        );

        statusMenu.setBackground(new java.awt.Color(241, 237, 237));
        statusMenu.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        statusMenu.setMinimumSize(new java.awt.Dimension(800, 23));
        statusMenu.setPreferredSize(new java.awt.Dimension(20000000, 210));
        statusMenu.setLayout(new java.awt.GridBagLayout());

        lblStatus1.setBackground(new java.awt.Color(255, 255, 192));
        lblStatus1.setFont(new java.awt.Font("Segoe UI", 0, 12));
        lblStatus1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/casita.png"))); // NOI18N
        lblStatus1.setText("Software Tasador de Casas - FISI / Redes Neuronales");
        lblStatus1.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));
        lblStatus1.setIconTextGap(5);
        lblStatus1.setMaximumSize(new java.awt.Dimension(500, 22));
        lblStatus1.setMinimumSize(new java.awt.Dimension(350, 22));
        lblStatus1.setOpaque(true);
        lblStatus1.setPreferredSize(new java.awt.Dimension(350, 22));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        statusMenu.add(lblStatus1, gridBagConstraints);

        lblStatus2.setBackground(new java.awt.Color(192, 255, 255));
        lblStatus2.setFont(new java.awt.Font("Segoe UI", 0, 12)); // NOI18N
        lblStatus2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/calendar.png"))); // NOI18N
        lblStatus2.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));
        lblStatus2.setIconTextGap(5);
        lblStatus2.setMaximumSize(new java.awt.Dimension(450, 22));
        lblStatus2.setMinimumSize(new java.awt.Dimension(250, 22));
        lblStatus2.setOpaque(true);
        lblStatus2.setPreferredSize(new java.awt.Dimension(0, 0));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        statusMenu.add(lblStatus2, gridBagConstraints);

        lblStatus3.setBackground(new java.awt.Color(241, 237, 237));
        lblStatus3.setMaximumSize(new java.awt.Dimension(100, 22));
        lblStatus3.setMinimumSize(new java.awt.Dimension(30, 22));
        lblStatus3.setOpaque(true);
        lblStatus3.setPreferredSize(new java.awt.Dimension(30, 22));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 3;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
        statusMenu.add(lblStatus3, gridBagConstraints);

        lblStatus4.setBackground(new java.awt.Color(241, 237, 237));
        lblStatus4.setFont(new java.awt.Font("Segoe UI", 0, 12));
        lblStatus4.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        lblStatus4.setMaximumSize(new java.awt.Dimension(800, 22));
        lblStatus4.setMinimumSize(new java.awt.Dimension(750, 22));
        lblStatus4.setOpaque(true);
        lblStatus4.setPreferredSize(new java.awt.Dimension(750, 22));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 4;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.ipadx = 15;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
        statusMenu.add(lblStatus4, gridBagConstraints);

        mnuArchivo.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 8, 2, 8));
        mnuArchivo.setText("Archivo");
        mnuArchivo.setMargin(new java.awt.Insets(0, 5, 0, 2));

        mnuItemImportarEjem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F2, 0));
        mnuItemImportarEjem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/importar.png"))); // NOI18N
        mnuItemImportarEjem.setText("Importar Ejemplos");
        mnuItemImportarEjem.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 3, 2, 20));
        mnuItemImportarEjem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnuItemImportarEjemActionPerformed(evt);
            }
        });
        mnuArchivo.add(mnuItemImportarEjem);

        mnuItemQuitarEjem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK));
        mnuItemQuitarEjem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/delete-file.png"))); // NOI18N
        mnuItemQuitarEjem.setText("Borrar Ejemplos");
        mnuItemQuitarEjem.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 3, 2, 20));
        mnuItemQuitarEjem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnuItemQuitarEjemActionPerformed(evt);
            }
        });
        mnuArchivo.add(mnuItemQuitarEjem);

        mnuItemTasarCasas.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F3, 0));
        mnuItemTasarCasas.setText("Tasar Casas");
        mnuItemTasarCasas.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 3, 2, 20));
        mnuItemTasarCasas.setPreferredSize(new java.awt.Dimension(203, 26));
        mnuItemTasarCasas.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnuItemTasarCasasActionPerformed(evt);
            }
        });
        mnuArchivo.add(mnuItemTasarCasas);
        mnuArchivo.add(jSeparator1);

        mnuItemSalir.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        mnuItemSalir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/Salir.png"))); // NOI18N
        mnuItemSalir.setText("Salir");
        mnuItemSalir.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 3, 2, 20));
        mnuItemSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnuItemSalirActionPerformed(evt);
            }
        });
        mnuArchivo.add(mnuItemSalir);

        jMenuBar1.add(mnuArchivo);

        mnuEditar.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 8, 2, 8));
        mnuEditar.setText("Editar");
        mnuEditar.setMargin(new java.awt.Insets(0, 5, 0, 2));

        mnuModEjemplos.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_E, java.awt.event.InputEvent.CTRL_MASK));
        mnuModEjemplos.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/edit_ejemplos.png"))); // NOI18N
        mnuModEjemplos.setText("Modificar Ejemplos");
        mnuModEjemplos.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 5, 2, 20));
        mnuModEjemplos.setPreferredSize(new java.awt.Dimension(290, 26));
        mnuModEjemplos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnuModEjemplosActionPerformed(evt);
            }
        });
        mnuEditar.add(mnuModEjemplos);
        mnuEditar.add(jSeparator2);

        mnuEditParamLibres.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_L, java.awt.event.InputEvent.CTRL_MASK));
        mnuEditParamLibres.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/file_edit3.png"))); // NOI18N
        mnuEditParamLibres.setText("Editar Parámetros Libres");
        mnuEditParamLibres.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 5, 2, 20));
        mnuEditParamLibres.setPreferredSize(new java.awt.Dimension(290, 26));
        mnuEditParamLibres.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnuEditParamLibresActionPerformed(evt);
            }
        });
        mnuEditar.add(mnuEditParamLibres);

        mnuEditErroryN.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.event.InputEvent.CTRL_MASK));
        mnuEditErroryN.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/file_edit.png"))); // NOI18N
        mnuEditErroryN.setText("Editar Error y Factor de Aprendizaje");
        mnuEditErroryN.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 5, 2, 20));
        mnuEditErroryN.setPreferredSize(new java.awt.Dimension(290, 26));
        mnuEditErroryN.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnuEditErroryNActionPerformed(evt);
            }
        });
        mnuEditar.add(mnuEditErroryN);

        jMenuBar1.add(mnuEditar);

        jMenu3.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 8, 2, 8));
        jMenu3.setText("Entrenamiento");
        jMenu3.setMargin(new java.awt.Insets(0, 3, 0, 3));

        mnuItemIniciarEntrenamiento.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_I, java.awt.event.InputEvent.CTRL_MASK));
        mnuItemIniciarEntrenamiento.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/start.png"))); // NOI18N
        mnuItemIniciarEntrenamiento.setText("Iniciar Entrenamiento");
        mnuItemIniciarEntrenamiento.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 5, 2, 20));
        mnuItemIniciarEntrenamiento.setMargin(new java.awt.Insets(0, 10, 0, 0));
        mnuItemIniciarEntrenamiento.setPreferredSize(new java.awt.Dimension(235, 26));
        mnuItemIniciarEntrenamiento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnuItemIniciarEntrenamientoActionPerformed(evt);
            }
        });
        jMenu3.add(mnuItemIniciarEntrenamiento);

        jMenuBar1.add(jMenu3);

        jMenu5.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 8, 2, 8));
        jMenu5.setText("Ayuda");
        jMenu5.setMargin(new java.awt.Insets(0, 3, 0, 3));

        mnuItemAcercaDe.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/creador.png"))); // NOI18N
        mnuItemAcercaDe.setText("Acerca de los creadores");
        mnuItemAcercaDe.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 5, 2, 20));
        mnuItemAcercaDe.setMargin(new java.awt.Insets(0, 10, 0, 0));
        mnuItemAcercaDe.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mnuItemAcercaDeActionPerformed(evt);
            }
        });
        jMenu5.add(mnuItemAcercaDe);

        jMenuBar1.add(jMenu5);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(pnlEntrenamiento, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(statusMenu, javax.swing.GroupLayout.DEFAULT_SIZE, 1982, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(pnlEntrenamiento, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(statusMenu, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        java.awt.Dimension dialogSize = getSize();
        setLocation((screenSize.width-dialogSize.width)/2,(screenSize.height-dialogSize.height)/2);
    }// </editor-fold>//GEN-END:initComponents

    private void mnuItemSalirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuItemSalirActionPerformed
        System.exit(0);
    }//GEN-LAST:event_mnuItemSalirActionPerformed

    private void mnuItemImportarEjemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuItemImportarEjemActionPerformed
        JFileChooser chooser;
        if(System.getProperty("os.name").equals("Windows XP")) {
            chooser = new JFileChooser("C:/Documents and Settings/" + 
                    System.getProperty("user.name") +"/Escritorio/");
        } else { // SI ES WINDOWS 7
            chooser = new JFileChooser("C:/Users/" + System.getProperty("user.name") + "/Desktop/");
        }
        
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Hojas de Cálculo (.xls o .xlsx)", "xls", "xlsx");
        chooser.setAcceptAllFileFilterUsed(false);
        chooser.setFileFilter(filter);
        int returnVal = chooser.showOpenDialog(this);

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            filePath = chooser.getSelectedFile().toString();
            System.out.println("Elegiste el archivo: " + chooser.getSelectedFile());

            if (isFileValid(filePath)) {
                cargandoDatos();
                if (!errorFile) {
                    lblStatus4.setIcon(new ImageIcon(getClass().getResource("/imagenes/Ok.png")));
                    lblStatus4.setText("El archivo fue importado correctamente.");
                    FrmEjemplos frmEjemplos = new FrmEjemplos(this, true, listEjemplos,
                            listNombParam);
                    frmEjemplos.setVisible(true);
                } else {
                    lblStatus4.setIcon(new ImageIcon(getClass().getResource("/imagenes/ErrorImag.png")));
                    lblStatus4.setText("Los datos no son correctos. Revise que el archivo contenga datos correctos.");
                    resetData();
                }
            } else {
            }
        }
    }//GEN-LAST:event_mnuItemImportarEjemActionPerformed

    private void mnuItemTasarCasasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuItemTasarCasasActionPerformed
        FrmIngresoDatos frmIngresoDatos = new FrmIngresoDatos(this, true, redAdalaine);
        frmIngresoDatos.setVisible(true);
    }//GEN-LAST:event_mnuItemTasarCasasActionPerformed

    private void mnuModEjemplosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuModEjemplosActionPerformed
        try {
            FrmEjemplos frmEjemplos = new FrmEjemplos(this, true, listEjemplos, listNombParam);
            frmEjemplos.setVisible(true);
        } catch (NullPointerException e) {
            lblStatus4.setIcon(new ImageIcon(getClass().getResource("/imagenes/ErrorImag.png")));
            lblStatus4.setText("No hay datos importados. Debe importar al menos una hoja de excel "
                    + "con la que trabajar.");
        }

    }//GEN-LAST:event_mnuModEjemplosActionPerformed

    private void mnuItemQuitarEjemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuItemQuitarEjemActionPerformed
        resetData();
    }//GEN-LAST:event_mnuItemQuitarEjemActionPerformed

    private void mnuEditParamLibresActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuEditParamLibresActionPerformed
        double[][] mPesos;
        try {
            FrmParamLibres frmParamLibres = new FrmParamLibres(this, true,
                    redAdalaine.getNumNeurEntrada(), redAdalaine.getmPesos());
            frmParamLibres.setVisible(true);
            mPesos = convertirMPesos(frmParamLibres.getBias(), frmParamLibres.getListPesos());
            redAdalaine.setmPesos(mPesos);
            
        } catch (Exception e) {
            lblStatus4.setIcon(new ImageIcon(getClass().getResource("/imagenes/ErrorImag.png")));
            lblStatus4.setText("No hay datos importados. Debe importar al menos una hoja de excel "
                    + "con la que trabajar.");
            return;
        }

        redAdalaine.mostrarPesos();
    }//GEN-LAST:event_mnuEditParamLibresActionPerformed

    private void mnuEditErroryNActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuEditErroryNActionPerformed
        FrmErroryN frmErroryN = new FrmErroryN(this, true, redAdalaine.getFactorAprendizaje(),
                redAdalaine.getErrorEsperado());
        frmErroryN.setVisible(true);

        System.out.println("\nEn el menu");
        System.out.println("Factor: " + frmErroryN.getFactorAprendizaje());
        System.out.println("Factor: " + frmErroryN.getErrorEsperado());
        
        redAdalaine.setFactorAprendizaje(frmErroryN.getFactorAprendizaje());
        redAdalaine.setErrorEsperado(frmErroryN.getErrorEsperado());
    }//GEN-LAST:event_mnuEditErroryNActionPerformed

    private void mnuItemIniciarEntrenamientoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuItemIniciarEntrenamientoActionPerformed
        try {
            FrmIniciarEntrenamiento frmIniciarEntrenamiento = new FrmIniciarEntrenamiento(
                    this, true, redAdalaine, listEjemplos);
            frmIniciarEntrenamiento.setVisible(true);
        } catch (Exception e) {
            // e.printStackTrace();
            lblStatus4.setIcon(new ImageIcon(getClass().getResource("/imagenes/ErrorImag.png")));
            lblStatus4.setText("No hay datos importados. Debe importar al menos una hoja de excel "
                    + "con la que trabajar.");
            return;
        }
    }//GEN-LAST:event_mnuItemIniciarEntrenamientoActionPerformed

    private void mnuItemAcercaDeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuItemAcercaDeActionPerformed
        new FrmAcercaDe(this, true).setVisible(true);  
    }//GEN-LAST:event_mnuItemAcercaDeActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(FrmMenu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(FrmMenu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(FrmMenu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(FrmMenu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new FrmMenu().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel1;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenu jMenu5;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JPopupMenu.Separator jSeparator2;
    private javax.swing.JLabel lblStatus1;
    private javax.swing.JLabel lblStatus2;
    private javax.swing.JLabel lblStatus3;
    private javax.swing.JLabel lblStatus4;
    private javax.swing.JMenu mnuArchivo;
    private javax.swing.JMenuItem mnuEditErroryN;
    private javax.swing.JMenuItem mnuEditParamLibres;
    private javax.swing.JMenu mnuEditar;
    private javax.swing.JMenuItem mnuItemAcercaDe;
    private javax.swing.JMenuItem mnuItemImportarEjem;
    private javax.swing.JMenuItem mnuItemIniciarEntrenamiento;
    private javax.swing.JMenuItem mnuItemQuitarEjem;
    private javax.swing.JMenuItem mnuItemSalir;
    private javax.swing.JMenuItem mnuItemTasarCasas;
    private javax.swing.JMenuItem mnuModEjemplos;
    private javax.swing.JPanel pnlEntrenamiento;
    private javax.swing.JPanel statusMenu;
    // End of variables declaration//GEN-END:variables

    private void initStatusBar() {
        Date fecha = new Date();
        SimpleDateFormat formatFecha = new SimpleDateFormat("EEEE',' dd 'de' MMMM 'de' yyyy", new Locale("ES"));
        lblStatus2.setText(formatFecha.format(fecha));
    }

    private boolean isFileValid(String filePath) {
        /* PROCESANDO EL ARCHIVO EXCEL: VERIFICANDO */
        try {
            Workbook fileExcel = Workbook.getWorkbook(new File(filePath));
            if (fileExcel.getNumberOfSheets() > 0) {    // VALIDACION 1: NUMERO DE HOJAS > 0
                Sheet hoja = fileExcel.getSheet(0); // trae la hoja 1
                int numColumnas = hoja.getColumns();
                int numFilas = hoja.getRows();
                filaEmpieza = -1;
                colEmpieza = -1;
                System.out.printf("Numero de columnas:%d\tNumero de filas:%d\n", numColumnas, numFilas);

                int[] posInicio = posInicial(hoja);
                filaEmpieza = posInicio[0];
                colEmpieza = posInicio[1];
                System.out.printf("FilaEmpieza:%d\tColumnaEmpieza:%d\n", filaEmpieza, colEmpieza);

                colEmpieza2 = posInicial2(hoja, filaEmpieza, colEmpieza);
                System.out.printf("ColumnaEmpiezaTabla2:%d\n", colEmpieza2);
                if (colEmpieza2 == -1) {
                    lblStatus4.setIcon(new ImageIcon(getClass().getResource("/imagenes/ErrorImag.png")));
                    lblStatus4.setText("El archivo no cumple con los formatos válidos. "
                            + "Ver en Ayuda > Instrucciones para ver los formatos validos.");
                    errorFile = true;
                    return false;
                }
            } else {
                lblStatus4.setIcon(new ImageIcon(getClass().getResource("/imagenes/ErrorImag.png")));
                lblStatus4.setText("Archivo no válido...debe contener al menos una hoja!!");
                errorFile = true;
                return false;
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this,
                    "Lo sentimos, archivo no pudo ser importado.\n"
                    + "El archivo puede estar corrupto o no es un formato soportado.",
                    "Fallo al importar", JOptionPane.ERROR_MESSAGE);
            errorFile = true;
            return false;
        }
        errorFile = false;
        return true;
    }

    private int[] posInicial(Sheet hoja) {
        int filaEmpiezaLocal = -1;
        int colEmpiezaLocal = -1;
        String data;
        /* RECORRIDO POR FILAS */
        for (int fila = 0; fila < hoja.getRows(); fila++) {
            for (int columna = 0; columna < hoja.getColumns(); columna++) {
                data = hoja.getCell(columna, fila).getContents();
                if (!data.equals("")) {
                    colEmpiezaLocal = columna;
                    break;
                }
            }
            if (colEmpiezaLocal != -1) {
                filaEmpiezaLocal = fila;
                break;
            }
        }
        return new int[]{filaEmpiezaLocal, colEmpiezaLocal};
    }

    /* 
     * RETORNA LA POSICION INICIAL DE LA COLUMNA DE LA TABLA 2.
     * VALIDA TAMBIEN QUE NO HAYA ESPACIOS EN BLANCO EN LA TABLA 1, Y QUE
     * "EXISTA" LA TABLA 2, O SEA, QUE HAYA SOLO UN ESPACIO EN BLANCO,
     * RETORNA -1 SI NO SE VALIDA LO ANTERIOR. 
     * VALIDACION 2: EXISTENCIA DE 2 TABLAS.
     */
    private int posInicial2(Sheet hoja, int filaEmpieza, int colEmpieza) {
        int posVacio = getColumnaVacio(hoja, filaEmpieza, colEmpieza);
        if (posVacio != -1) {
            for (int fila = filaEmpieza + 1; fila < hoja.getRows(); fila++) {
                if (posVacio != getColumnaVacio(hoja, fila, colEmpieza)) {
                    posVacio = -1;
                    break;
                }
            }
        }
        return posVacio;
    }

    /* 
     * RETORNA LA POSICION DE LA COLUMNA QUE ESTA VACIA EN LA FILA DADA.
     * SI EN DICHA FILA EXISTE MAS DE UN ESPACIO EN BLANCO, O NO EXISTE
     * ESPACIO EN BLANCO, SE RETORNARA -1, POR LO QUE LA HOJA DE CALCULO NO PASA 
     * LA VALIDACION 2.
     */
    private int getColumnaVacio(Sheet hoja, int fila, int colEmpieza) {
        int posicion = -1;
        String data;
        for (int columna = colEmpieza; columna < hoja.getColumns(); columna++) {
            data = hoja.getCell(columna, fila).getContents();
            if (data.equals("")) {
                if (posicion == -1) {
                    posicion = columna;
                } else {
                    posicion = -1;
                }
            }
        }
        return posicion;
    }

    private void cargandoDatos() {
        /* PROCESANDO EL ARCHIVO EXCEL: TRANSCRIBIENDO */
        /* VERIFICANDO CORRELATIVIDAD */
        try {
            Workbook fileExcel = Workbook.getWorkbook(new File(filePath));
            Sheet hoja = fileExcel.getSheet(0);
            if (colEmpieza == 0) {
                if (isCorrelated(hoja, colEmpieza, filaEmpieza + 1)) {
                    colEmpieza++;
                }
                filaEmpieza++;
            } else {
                String data;
                data = hoja.getCell(colEmpieza - 1, filaEmpieza + 1).getContents();
                if (!data.equals("")) {
                    // es correlativo
                    filaEmpieza++;
                } else {
                    if (isCorrelated(hoja, colEmpieza, filaEmpieza + 1)) {
                        colEmpieza++;
                    }
                    filaEmpieza++;
                }
            }
            colEmpieza2++;

            /* CARGANDO DATOS */
            numEjemplos = hoja.getRows() - filaEmpieza;
            listEjemplos = new ArrayList<Ejemplo>(numEjemplos);
            int numNeurEntrada = colEmpieza2 - colEmpieza - 1;
            redAdalaine = new RedAdalaine(numNeurEntrada, 0.1f, 0.2f);

            cargandoNombres(hoja);
            cargandoEjemplos(hoja);
        } catch (Exception e) {
        }
    }

    private boolean isCorrelated(Sheet hoja, int col, int filaEmp) {
        int val1, val2;
        try {
            for (int fila = filaEmp; fila < hoja.getRows() - 1; fila++) {
                val1 = Integer.valueOf(hoja.getCell(col, fila).getContents());
                val2 = Integer.valueOf(hoja.getCell(col, fila + 1).getContents());
                if (val2 != val1 + 1) {
                    return false;
                }
            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    private void cargandoNombres(Sheet hoja) {
        listNombParam = new ArrayList<String>(redAdalaine.getNumNeurEntrada() + 1);
        int fila = filaEmpieza - 1;
        int columna;
        String data = "";
        for (columna = colEmpieza; columna < redAdalaine.getNumNeurEntrada()
                + colEmpieza; columna++) {
            data = hoja.getCell(columna, fila).getContents();
            listNombParam.add(data);
        }
        data = hoja.getCell(columna + 1, fila).getContents();
        listNombParam.add(data);
        mostrarLista(listNombParam);
    }

    private void cargandoEjemplos(Sheet hoja) {
        // UN EJEMPLO SIEMPRE INICIA CON 1.0, PUES ES EL VALOR Xi PARA
        // EL BIAS.
        double val;
        List<Double> vEntrada;
        List<Double> vSalida;
        int columna;
        try {
            for (int fila = filaEmpieza; fila < filaEmpieza + numEjemplos; fila++) {
                vEntrada = new ArrayList<Double>(redAdalaine.getNumNeurEntrada() + 1);
                vSalida = new ArrayList<Double>(redAdalaine.getNumNeurSalida());
                for (columna = colEmpieza; columna < colEmpieza + redAdalaine.getNumNeurEntrada();
                        columna++) {
                    val = Double.valueOf(hoja.getCell(columna, fila).getContents());
                    vEntrada.add(val);
                }
                val = Double.valueOf(hoja.getCell(columna + 1, fila).getContents());
                vSalida.add(val);
                listEjemplos.add(new Ejemplo(vEntrada, vSalida));
            }
            mostrarLista(listEjemplos);
        } catch (Exception e) {
            errorFile = true;
            lblStatus4.setIcon(new ImageIcon(getClass().getResource("/imagenes/ErrorImag.png")));
            lblStatus4.setText("Los datos no son correctos. Revise que el archivo contenga datos correctos.");
        }
    }

    private void mostrarLista(List<?> listValores) {
        for (Object elemento : listValores) {
            System.out.print(elemento + "  ");
        }
        System.out.println("");
    }

    private void resetData() {
        this.filaEmpieza = -1;
        this.colEmpieza = -1;
        this.colEmpieza2 = -1;
        this.filePath = "";
        this.errorFile = true;
        this.numEjemplos = -1;

        redAdalaine = null;
        listEjemplos = null;
        listNombParam = null;
        //this.redAdalaine = new RedAdalaine(1, 0.0f, 1.0f);
        //listEjemplos = new ArrayList<Ejemplo>(1);
        //listNombParam = new ArrayList<String>(1);
    }

    // Devuelve una matriz de pesos listo para la red, donde la posicion
    // inicial de la matriz es el bias, luego siguen los pesos de cada entrada
    private double[][] convertirMPesos(double bias, List<Double> listPesos) {
        double[][] mPesos = new double[1][listPesos.size() + 1];
        mPesos[0][0] = bias;
        for (int i = 1; i < listPesos.size() + 1; i++) {
            mPesos[0][i] = listPesos.get(i - 1);
        }

        return mPesos;
    }
}
